home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / Dev / Amiga-E / E_v3.2a / Src / Gfx / Mandel256.e < prev    next >
Text File  |  1992-09-02  |  2KB  |  79 lines

  1. /* 256 greyscale mandelbrot with inline 68881 code
  2.  
  3.    WARNING: this program won't run without a FPU/AGA!
  4.  
  5. */
  6.  
  7. MODULE '*mandelcalc881'
  8.  
  9. CONST WIDTH=320,HEIGHT=256,MODUS=$0,FAC=4
  10.  
  11. DEF top,left,bottom,right,width,height,xmax,ymax
  12.  
  13. PROC main() HANDLE
  14.   DEF scr,view,a,b
  15.   IF (scr:=OpenS(WIDTH,HEIGHT,8,MODUS,'Mandel256'))=NIL THEN Raise(0)
  16.   view:=scr+44
  17.   SetRGB32(view,0,0,0,0)
  18.   FOR a:=1 TO 255 DO (b:=Shl(256-a,24)) BUT SetRGB32(view,a,b,b,b)
  19.   mandel()
  20.   WHILE Mouse()=0 DO NOP
  21. EXCEPT DO
  22.   CloseS(scr)
  23. ENDPROC
  24.  
  25. PROC mandel()
  26.   left:=-2.5; right:=1.0
  27.   top:=-1.4; bottom:=1.4
  28.   width:=!right-left
  29.   height:=!bottom-top
  30.   xmax:=WIDTH!
  31.   ymax:=HEIGHT-1!
  32.   recmandel(0,0,WIDTH-1,HEIGHT-1)
  33. ENDPROC
  34.  
  35. PROC recmandel(x1,y1,x2,y2)
  36.   DEF p1,p2,p3,p4,xm,ym,a
  37.   IF Mouse() THEN Raise(0)
  38.   IF FreeStack()<1000 THEN Raise(0)
  39.   p1:=calcxy(x1,y1)
  40.   p2:=calcxy(x2,y1)
  41.   p3:=calcxy(x2,y2)
  42.   p4:=calcxy(x1,y2)
  43.   IF (p1=p2) AND (p2=p3) AND (p3=p4) AND (Sign(x1)=Sign(x2)) AND (Sign(y1)=Sign(y2))
  44.     Box(x1,y1,x2,y2,p1)
  45.   ELSE
  46.     Plot(x1,y1,p1)
  47.     Plot(x2,y1,p2)
  48.     Plot(x2,y2,p3)
  49.     Plot(x1,y2,p4)
  50.     IF (x2-x1<2) OR (y2-y1<2)
  51.       IF x2-x1>1
  52.         FOR a:=x1+1 TO x2-1 DO plotxy(a,y1)
  53.         IF HEIGHT-1=y2 THEN FOR a:=x1+1 TO x2-1 DO plotxy(a,y2)
  54.       ENDIF
  55.       IF y2-y1>1
  56.         FOR a:=y1+1 TO y2-1 DO plotxy(x1,a)
  57.         IF WIDTH-1=x2 THEN FOR a:=y1+1 TO y2-1 DO plotxy(x2,a)
  58.       ENDIF
  59.     ELSE
  60.       xm:=x1+x2/2
  61.       ym:=y1+y2/2
  62.       recmandel(x1,y1,xm,ym)
  63.       recmandel(xm,y1,x2,ym)
  64.       recmandel(x1,ym,xm,y2)
  65.       recmandel(xm,ym,x2,y2)
  66.     ENDIF
  67.   ENDIF
  68. ENDPROC
  69.  
  70. PROC calcxy(x,y)
  71.   DEF xr,yr
  72.   xr:=x!/xmax*width+left
  73.   yr:=y!/ymax*height+top
  74. ENDPROC calc(256/FAC,xr,yr)*FAC
  75.  
  76. PROC plotxy(x,y)
  77.   Plot(x,y,calcxy(x,y))
  78. ENDPROC
  79.